package org.hjl.commonutils.result;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

import java.io.Serializable;

/**
 * 返回结果模型
 *
 * @author hjl
 * @since 2019-05-10 21:50
 */

@Data
@JsonSerialize
public class R<T> implements Serializable {

    /**
     * 序列化标识
     */
    private static final long serialVersionUID = 1231321321321L;
    /**
     * 状态码
     */
    private int code;
    /**
     * 状态信息
     */
    private String msg;
    /**
     * 结果数据
     */
    private T data;
    /**
     * 成功码：200
     */
    public static final int SUCCESS_CODE = 200;
    /**
     * 成功信息：操作成功
     */
    public static final String SUCCESS_MESSAGE = "操作成功";
    /**
     * 错误码：500
     */
    public static final int ERROR_CODE = 500;
    /**
     * 错误信息：重复操作
     */
    public static final String ERROR = "请勿重复操作！";
    /**
     * 错误信息：内部异常
     */
    public static final String ERROR_MESSAGE = "网络繁忙，请稍后重试";
    /**
     * 错误码：400
     */
    public static final int ILLEGAL_CODE = 400;
    /**
     * 错误信息：参数非法
     */
    public static final String ILLEGAL_MESSAGE = "参数非法";
    /**
     * 请登录:
     */
    public static final int LOGIN_ERROR_CODE = 100;
    public static final String LOGIN_ERROR_MSG = "Token验证失效";

    /**
     * Result
     */
    public R() {
        this.code = SUCCESS_CODE;
        this.msg = SUCCESS_MESSAGE;
    }

    /**
     * Result
     *
     * @param code 状态码
     * @param msg  状态信息
     */
    R(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * Result
     *
     * @param code 状态码
     * @param msg  状态信息
     * @param data 对象
     */
    R(int code, String msg, T data) {
        super();
        this.code(code).msg(msg).data(data);
    }

    /**
     * code
     *
     * @param code 状态码
     * @return Result
     */
    private R<T> code(int code) {
        this.code = code;
        return this;
    }

    /**
     * msg
     *
     * @param msg 状态信息
     * @return Result
     */
    private R<T> msg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * data
     *
     * @param data 对象
     * @return Result
     */
    private R<T> data(T data) {
        this.data = data;
        return this;
    }

}
